package com.ershi.spring.annotation.config;


import com.ershi.spring.annotation.bean.Child;
import com.ershi.spring.annotation.conditional.ConditionalBean;
import com.ershi.spring.annotation.di.HelloDao;
import com.ershi.spring.annotation.imports.Dog;
import com.ershi.spring.annotation.imports.MyImportBeanDefinitionRegistrar;
import com.ershi.spring.annotation.imports.MyImportSelector;
import com.ershi.spring.annotation.lazy.LazyBean;
import com.ershi.spring.annotation.lookup.Children;
import com.ershi.spring.annotation.values.ValueBean;
import com.ershi.spring.annotation.conditional.MyConditional;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.*;

/**
 * @author 二十
 * @since 2021/10/30 8:05 下午
 */
@Configuration
@ComponentScan("com.ershi.spring.annotation")
/**
 * @Import注解的初级使用：直接将想导入的类放在注解里面。spring会利用bean的无参构造器，反射创建对象放到容器中。
 *
 * ImportSelector
 *
 * ImportBeanDefinitionRegistrar
 */
//@Import({Dog.class, MyImportBeanDefinitionRegistrar.class, MyImportSelector.class})
/**
 * import的第一种使用方式
 * 可以导入第三方jar中的组件到容器中
 */
//@Import({Dog.class})
/**
 * import的第二种使用方式：
 * 通过往容器中注册一个 bd的方式，导入bean到容器中
 */
//@Import({MyImportBeanDefinitionRegistrar.class})
/**
 * import 的第三种使用方式：
 * 通过指定全限定类名，往容器中导入一个类的元信息
 */
@Import({MyImportSelector.class})
/**
 * 注意这里指定编码，如果不指定编码，默认使用ISO8859-1编码
 */
@PropertySource(value="classpath:girl.properties",encoding = "UTF-8")
public class SpringConfig {

	@Value("二十")
	private String name;

	/**
	 * ${} : 取出配置文件的值
	 * #{} : SPEL表达式
	 */
	@Value("#{21-1}")
	private Integer age;

	@Bean(name = "child",initMethod = "init",destroyMethod = "destroy")
	@Scope(scopeName= ConfigurableBeanFactory.SCOPE_SINGLETON)
	public Child person() {
		return new Child(20, "二十");
	}

	@Bean
	@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
	public Children children(){
		return new Children();
	}

	@Bean
	@Lazy
	public LazyBean lazyBean() {
		return new LazyBean();
	}

	/**
	 * 想要容器中有这个bean，那么当前系统不能是mac
	 * @return
	 */
	@Bean
	@Conditional({MyConditional.class})
	public ConditionalBean conditionalBean() {
		return new ConditionalBean();
	}



	@Bean
	public ValueBean valueBean() {
		ValueBean valueBean = new ValueBean();
		valueBean.setName(name);
		valueBean.setAge(age);
		return valueBean;
	}

	@Bean(name="lisi")
	public HelloDao lisi(){
		HelloDao dao = new HelloDao();
		dao.setName("李四");
		return dao;
	}
	/*优先择偶权*/
	@Primary
	@Bean(name="zs")
	public HelloDao zs(){
		HelloDao dao = new HelloDao();
		dao.setName("张三");
		return dao;
	}
}
